"use strict";

var d = function(arg) {
	console.log(arg)
};

(function(exports){
	var _tabs = $('#tabs_container');
	
	//打开Tab
	exports.openTab = function(_title, _url) {
		var _tabItem = _tabs.tabs('getTab', _title),
			_selected = _tabs.tabs('getSelected');
		if ( _tabItem == null ) {
			_tabs.tabs('add', {title: _title, closable: true, href: _url, onLoad: modules._init, onBeforeLoad: modules._destroy });	//onLoad即页面加载成功就调用模块
		} else {
			_selected == _tabItem ? _tabItem.panel('refresh', _url) : _tabs.tabs('select', _title);	//存在未选中则打开，否则刷新
		}
		
		//initModule2();
	};
	$('#menu_func').on('click', '.ui-menu-main a', function() {
		var _self = $(this),
			_title = _self.html(),
			_url = $.trim(_self.attr('href'));
		
		if (!!!_url || _url == '#' || _url.indexOf('javascript:') != -1) {	//过滤非法URL
			return false;
		}
		
		openTab(_title, _url);
		
		_self.addClass('on');	//加上点击样式
		$('#menu_func .ui-menu-main a').not(_self).removeClass('on');	//去掉其他样式
		
		return false;
	});
	
	//设置搜索Panel高度
	exports._resetHeight = function() {
		var p = $(this);
		var oldHeight = p.panel('panel').outerHeight();
		p.panel('resize', {height:'auto'});
	};
	
	//自定义菜单
	var _tabs_cm = $('#tabs-contextmenu');
	_tabs.on('contextmenu', '.tabs li',function(e){
		e.preventDefault();
		_tabs_cm.menu('show', {
			left: e.pageX,
			top: e.pageY
		});
		
	});
	_tabs_cm.find("[rel=close]").on("click", function(){
		var tab = _tabs.tabs('getSelected');
		var index = _tabs.tabs('getTabIndex',tab);
		index != 0 ? _tabs.tabs('close',index) : null;
	});
	//关闭所有标签页
	_tabs_cm.find("[rel=closeAll]").on("click",function(){
		var tablist = _tabs.tabs('tabs');
		for(var i=tablist.length-1;i>=0;i--){
			i != 0 ? _tabs.tabs('close', i) : null;
		}
	});
	//关闭非当前标签页（先关闭右侧，再关闭左侧）
	_tabs_cm.find("[rel=closeOther]").on("click",function(){
		var tablist = _tabs.tabs('tabs');
		var tab = _tabs.tabs('getSelected');
		var index = _tabs.tabs('getTabIndex',tab);
		for(var i=tablist.length-1;i>index;i--){
			_tabs.tabs('close',i);
		}
		var num = index-1;
		for(var i=num;i>0;i--){
			_tabs.tabs('close', 1);
		}
	});
	//关闭当前标签页右侧标签页
	_tabs_cm.find("[rel=closeRight]").on("click",function(){
		var tablist = _tabs.tabs('tabs');
		var tab = _tabs.tabs('getSelected');
		var index = _tabs.tabs('getTabIndex',tab);
		for(var i=tablist.length-1;i>index;i--){
			_tabs.tabs('close',i);
		}
	});
	//关闭当前标签页左侧标签页
	_tabs_cm.find("[rel=closeLeft]").on("click",function(){
		var tab = _tabs.tabs('getSelected');
		var index = _tabs.tabs('getTabIndex',tab);
		var num = index-1;
		for(var i=0;i<num;i++){
			_tabs.tabs('close', 1);
		}
	});
	
	
	
	//扫描并模块初始化
	var modules = exports.modules = {
		_context: {},
		_widgetPool: {},
		_getWidgetPool: function(moduleName) {
			if (!!!this._widgetPool[moduleName]) {
				this._widgetPool[moduleName] = new Array();
			}
			return this._widgetPool[moduleName];
		}
	};
	var Utils = {
		
		isFunction: function(obj) {
			return Object.prototype.toString.call(obj) == '[object Function]';
		},
		
		isObject: function(obj) {
			return Object.prototype.toString.call(obj) == '[object Object]';
		}
		
	};
	
	/**
	* @param this 当前模块上下文，通过上下文获取模块内的组件可以避免DOM ID冲突，也可以通过此对象来暴露对象（eg: this.[property]）
	* @param $ jQuery对象
	* @param ctx 模块上下文容器，可以通过此对象获取其他模块上下文并调用其暴露的对象（eg: ctx.[moduleName].property）
	* @param global window对象的引用，暴露全局
	* modules.list = function($, global, ctx) {	}
	*/
	modules._init = function() {
		var _initFlag = '_module_init_';
	
		var _m = $(this).children('[app-module]'),	//模块声明
			moduleName = _m.attr('app-module'),	//模块名
			moduleDom =  _m.parent(),	//模块所属DOM
			moduleWidgets = moduleDom.find('[data-ui^=easyui-]'),	//模块UI组件
			module = modules[moduleName],	//模块对象
			widgetPool = modules._getWidgetPool(moduleName);	//模块组件池(初始化组件有3处，一处扫描html，一处是js、一处是模块自定义ui属性加载)
		
		//在模块上下文获取组件
		var context = modules._context[moduleName] = function(selector) {
			// 先查找绑定对象，再查找模块容器对象
			for (var i in module) {
				if (selector == i) return module[i];
			}
			var _o = $(selector, moduleDom);
			
			if (_o.size() > 0 && selector.indexOf('#') == 0 ) {
				widgetPool.push(_o);	//加入控件池
			}
			return _o;
		};
		
		
		if ( $('[app-module=' + moduleName + ']').size() > 1 ) {	//模块初始化标记
			alert('模块冲突，模块[' + moduleName + ']已存在。');
			return false;
		}
		
		
		if ( module ) {	//存在模块定义
			moduleWidgets.each(function() {
				var _self = $(this),
					widgetName = _self.data('ui').replace('easyui-', ''),	//控件名
					wid = _self.attr('id');	//控件ID
				module['#' + wid] = _self[widgetName].call(_self);	//绑定控件到模块上下文
				widgetPool.push(module['#' + wid]);
			});
			
			//加入控件池
			moduleDom.find('[class*=easyui-]').each(function(){
				widgetPool.push($(this));
				
			});
			
			if (Utils.isFunction(module)) {	//方法定义模块
				module.call(context, jQuery, modules._context, window);
			} else if (Utils.isObject(module)) {	//对象定义模块
				module.init.call(context, jQuery, modules._context, window);
			}
			_m.data(_initFlag, true);	//模块初始化完成
		} else {
			alert('未知模块，模块[' + moduleName + ']不存在。');
		}
		
	};
	
	//模块销毁
	modules._destroy = function() {
		var _m = $(this).children('[app-module]'),	//模块声明
			moduleName = _m.attr('app-module'),	//模块名
			widgets = modules._getWidgetPool(moduleName);	//组件集合
			
		while (widgets.length > 0) {
			var _tmp = widgets.pop();
			$.each(_tmp.data(), function(key, value){
				if( this.options ) {
					try {
						_tmp[key]('destroy');
					} catch(e) {
						console.warn(e);
					}
					return false;
				}
			});
		}
		
	};
	
	
})(window);


/**
 * 修复EasyUI浮动框移出边框之外
 * 针对panel window dialog三个组件拖动时会超出父级元素的修正
 * 如果父级元素的overflow属性为hidden，则修复上下左右个方向
 * 如果父级元素的overflow属性为非hidden，则只修复上左两个方向
 * @param left
 * @param top
 * @returns
 */
var easyuiPanelOnMove = function(left, top) {
	var parentObj = $(this).panel('panel').parent();
	if (left < 0) {
		$(this).window('move', {
			left : 1
		});
	}
	if (top < 0) {
		$(this).window('move', {
			top : 1
		});
	}
	var width = $(this).panel('options').width;
	var height = $(this).panel('options').height;
	var right = left + width;
	var buttom = top + height;
	var parentWidth = parentObj.width();
	var parentHeight = parentObj.height();
	if(parentObj.css("overflow")=="hidden"){
		if(left > parentWidth-width){
			$(this).window('move', {
				"left":parentWidth-width
			});
		}
		if(top > parentHeight-height){
			$(this).window('move', {
				"top":parentHeight-height
			});
		}
	}
};
$.fn.panel.defaults.onMove = easyuiPanelOnMove;
$.fn.window.defaults.onMove = easyuiPanelOnMove;
$.fn.dialog.defaults.onMove = easyuiPanelOnMove;